package testes;

import static org.junit.Assert.*;

import java.lang.reflect.Method;
import java.util.LinkedList;

import gui.AssociaClassesEMetodosANomes;
import gui.DeclaracaoDeMetodo;
import gui.FachadaManipulacaoClassesDeUmProjeto;

import org.junit.Before;
import org.junit.Test;

public class TesteAssociaClassesEMetodosANomes 
{
	private AssociaClassesEMetodosANomes associaClassesEMetodosANomes;

	@Before
	public void setUp() throws Exception 
	{
		//primeiro, vamos instanciar o objeto associaClassesEMetodosANomes carregando as classes de um projeto:
		FachadaManipulacaoClassesDeUmProjeto fachada = new FachadaManipulacaoClassesDeUmProjeto();
		fachada.pegarTodasAsClassesDoProjeto("C:/Users/joao/Documents/eclipse new projets/TestBoot");
		//apos pegar todas as classes do projeto, uma instancia de associaClassesEMetodosANomes foi criada.
		associaClassesEMetodosANomes = fachada.getAssociaClassesEMetodosANomes();
	}

	@Test
	public void testPegarClasseDeNomeExistenteNoProjeto() 
	{
		Class classeNoProjeto = associaClassesEMetodosANomes.pegarClasseDeNome("TesteAssociaClassesEMetodosANomes");
		String nomeDaClasse = classeNoProjeto.getSimpleName();
		assertEquals("TesteAssociaClassesEMetodosANomes", nomeDaClasse);
	}
	
	@Test
	public void testPegarClasseDeNomeNaoExistenteNoProjeto() 
	{
		Class classeNoProjeto = associaClassesEMetodosANomes.pegarClasseDeNome("XXX");
		
		assertEquals(null, classeNoProjeto);
	}
	
	@Test
	public void testPegarCabecalhosDeMetodosDeClasseExistenteNoProjeto()
	{
		LinkedList<String> cabecalhosDeMetodosDaClasse = associaClassesEMetodosANomes.pegarCabecalhosDeMetodosDeUmaClasse("TesteAssociaClassesEMetodosANomes");
		/*for(int i = 0; i < cabecalhosDeMetodosDaClasse.size(); i++)
		{
			System.out.println("cabecalho::" + cabecalhosDeMetodosDaClasse.get(i));
		}*/
		if(cabecalhosDeMetodosDaClasse.contains("void testPegarCabecalhosDeMetodosDeClasseExistenteNoProjeto()") == false)
		{
			fail("sistema nao encontrou cabecalho de metodo void testPegarCabecalhosDeMetodosDeClasseExistenteNoProjeto() existente em TesteAssociaClassesEMetodosANomes");
		}
	}
	
	@Test
	public void testPegarCabecalhosDeMetodosDeClasseNaoExistenteNoProjeto()
	{
		LinkedList<String> cabecalhosDeMetodosDaClasse = associaClassesEMetodosANomes.pegarCabecalhosDeMetodosDeUmaClasse("XXX");
		assertEquals(cabecalhosDeMetodosDaClasse.size(), 0);
	}
	
	@Test
	public void testPegarMetodoDeCabecalhoExistenteNoProjeto()
	{
		Method objetoDoMetodoExistente = associaClassesEMetodosANomes.pegarMetodoDeNome("void testPegarMetodoDeCabecalhoExistenteNoProjeto()");
		assertEquals(objetoDoMetodoExistente.getName(), "testPegarMetodoDeCabecalhoExistenteNoProjeto");
	}
	
	@Test
	public void testPegarMetodoDeCabecalhoNaoExistenteNoProjeto()
	{
		Method objetoDoMetodoExistente = associaClassesEMetodosANomes.pegarMetodoDeNome("void XXX()");
		assertEquals(null, objetoDoMetodoExistente);
	}
	
	@Test
	public void pegarObjetoClassDeClasseExistenteNoProjeto()
	{
		Class objetoClassDeClasseDoProjeto = associaClassesEMetodosANomes.pegarClasseDeNome("TesteAssociaClassesEMetodosANomes");
		assertEquals("TesteAssociaClassesEMetodosANomes" , objetoClassDeClasseDoProjeto.getSimpleName());
	}
	
	@Test
	public void pegarDeclaracaoDeMetodoDeClasseExistenteNoProjeto()
	{
		LinkedList<DeclaracaoDeMetodo> declaracoesDeMetodosDaClasse = associaClassesEMetodosANomes.pegarMetodosDeClasse("TesteAssociaClassesEMetodosANomes");
		boolean encontreiMetodoDoTeste = false;
		for(int i = 0; i < declaracoesDeMetodosDaClasse.size(); i++)
		{
			DeclaracaoDeMetodo declaracaoDeMetodoDaClasse = declaracoesDeMetodosDaClasse.get(i);
			String cabecalhoDoMetodo = declaracaoDeMetodoDaClasse.getCabecalhoDoMetodo();
			if(cabecalhoDoMetodo.compareTo("void pegarDeclaracaoDeMetodoDeClasseExistenteNoProjeto()") == 0)
			{
				encontreiMetodoDoTeste = true;
			}
		}
		
		assertEquals(true, encontreiMetodoDoTeste);
	}
	
	@Test
	public void pegarDeclaracaoDeMetodoDeClasseNaoExistenteNoProjeto()
	{
		LinkedList<DeclaracaoDeMetodo> declaracoesDeMetodosDaClasse = associaClassesEMetodosANomes.pegarMetodosDeClasse("XXX");
		assertEquals(declaracoesDeMetodosDaClasse, null);
	}
	
	
	
	
	

}
